package com.ls.aicoderbackend.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.ls.aicoderbackend.constant.AppConstant;
import com.ls.aicoderbackend.exception.BusinessException;
import com.ls.aicoderbackend.exception.ErrorCode;
import com.ls.aicoderbackend.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;

public abstract class CodeFileSaveTemplate<T> {

    // 文件保存在根目录
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    public File saveCode(T result, Long appId) {
        // 校验结果
        validateInput(result);
        // 构建目录
        String baseDirPath = buildUniqueDir(appId);
        // 保存文件
        saveFile(result, baseDirPath);
        // 返回代码文件目录
        return new File(baseDirPath);
    }

    protected void validateInput(T result) {
        if (ObjUtil.isNull(result)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "结果为空");
        }
    }

    // 构建唯一路径, 并创建目录
    protected final String buildUniqueDir(Long appId) {
        if (ObjUtil.isNull(appId)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "appId为空");
        }
        String bizType = getBizType().getValue();
        String uniqueName = StrUtil.format("{}_{}", bizType, appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueName;
        // 创建目录
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    // 将文件写入到具体目录中
    protected final void writeToFile(String dirPath, String fileName, String content) {
        String filePath = dirPath + File.separator + fileName;
        FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
    }

    protected abstract void saveFile(T result, String baseDirPath);

    protected abstract CodeGenTypeEnum getBizType();
}
